package ch.hslu.dmg;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.eclipse.swt.widgets.DateTime;

import ch.hslu.dmg.model.Bestellung;
import ch.hslu.dmg.model.Teil;

public class FertigungsHelper {
	
	private static final String PERSISTENCE_UNIT_NAME = "fpPU";
	private EntityManagerFactory factory;
	EntityManager em = null;
	
	public EntityManager em(){
		if(em == null){
			factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
			em = factory.createEntityManager();	
		}
		return em;
	}
	
	public List<Teil> getAllTeils(){
		Query q = em().createQuery("select t from Teil t");
		List<Teil> teils = q.getResultList();
		System.out.println("Fetched " + teils.size() + " entries from Teil.");
		return teils;
	}
	
	public List<Bestellung> getAllOrders(){
		Query q = em().createQuery("select b from Bestellung b");
		List<Bestellung> b = q.getResultList();
		System.out.println("Fetched " + b.size() + " entries from Bestellung.");
		return b;
	}
	
	public void closeEntityManager(){
		em.close();
	}
	
	public void addOrder(long teilId, String name, String address, String bank){
		em().getTransaction().begin();
		//get the teil first
		Query q = em().createNamedQuery("Teil.findByTeilid");
		q.setParameter("teilid", teilId);
		
		Bestellung b = new Bestellung();
		em().persist(b);
		b.setName(name);
		b.setAdresse(address);
		b.setBankverbindung(bank);
		b.setTeilid((Teil)q.getSingleResult());
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		b.setLieferdatum(dateFormat.format(getPreCalcedDateForTeil(teilId, b)));
		em().persist(b);
		em.getTransaction().commit();
	}
	
	/*public List<Teil> getUnterteilByOberteil(long oberteilId){
		Query q = em().createQuery("select t from Teil t");
		List<Teil> teils = q.getResultList();
		System.out.println("Fetched " + teils.size() + " entries from Teil.");
		return teils;
	}*/
	
	public Teil getTeilById(long teilId){
		Query q = em().createNamedQuery("Teil.findByTeilid");
		q.setParameter("teilid", teilId);
		return (Teil)q.getSingleResult();
	}

	public Date getPreCalcedDateForTeil(long teilId, Bestellung belongingBestellung) {
		OrderCalculation oc = new OrderCalculation(teilId, belongingBestellung, this);
		return oc.getReadyDate();
	}

}
